Los modelos encapsulan la información referente al dominio de la aplicacion web. Compuestos por campos generalemnte cada modelo mapea a una unica tabla de la base de datos.
Cada modelo es una clase en Python que hereda de django.db.models.Model.
Cada atributo del modelo se corresponde con una columna en la base de datos.
Con esto Django genera automaticamente una API de acceso a datos.
Django tiene 4 backends oficiales MySQL, SQLite, Postgres y Oracle.
Existen otros backends creados por la comunidad para Firebird, ODBC, SQL Server y bases de datos no relacionales.
1 class Persona(models.Model):
2 nombre = models.CharField(max_length=50)
3
4
5 class Mascota(models.Model):
6 # Constantes
7 MACHO, HEMBRA = 'm', 'h'
8 SEXO_CHOICES = (
9 (MACHO, 'Macho'), (HEMBRA, 'Hembra')
10 )
11 duenio = models.ForeignKey(Persona, null=True, blank=True)
12 raza = models.ForeignKey('Especie') # Relación hacia adelante
13 sexo = models.CharField(max_length=1, choices=SEXO_CHOICES)
14
15 class Especie(models.Model):
16 nombre = models.CharField(max_length=50)
17 domesticable = models.BooleanField(default=True)
18
19 class Raza(models.Model):
20 nombre = models.CharField(max_length=50)
21 especie = models.ForeignKey(Especie)
1 python manage.py validate
2
3 0 errors found
1 python manage.py syncdb
2
3 Creating table common_persona
4 Creating table common_mascota
5 Creating table common_especie
6 Creating table common_raza
1 BEGIN;
2 CREATE TABLE "common_persona" (
3 "id" integer NOT NULL PRIMARY KEY,
4 "nombre" varchar(50) NOT NULL
5 );
6 CREATE TABLE "common_mascota" (
7 "id" integer NOT NULL PRIMARY KEY,
8 "duenio_id" integer REFERENCES "common_persona" ("id"),
9 "raza_id" integer NOT NULL,
10 "sexo" varchar(1) NOT NULL
11 );
12 CREATE TABLE "common_especie" (
13 "id" integer NOT NULL PRIMARY KEY,
14 "nombre" varchar(50) NOT NULL,
15 "domesticable" bool NOT NULL
16 );
17 CREATE TABLE "common_raza" (
18 "id" integer NOT NULL PRIMARY KEY,
19 "nombre" varchar(50) NOT NULL
20 );
21 COMMIT;
Y esto sin contar los índices!
Los modelos tiene herdean muchos métodos de models.Model, como save() y delete()
1 from miapp.models import Persona
2
3 p = Persona(nombre='Dundee')
4 p.save()
5
6 p.id
7 # -> 1
8
9 p.save()
10 p.id
11 # -> 1
12
13 q = Persona()
14 q.nombre = 'Anonio'
15 # -> None
16 q.save()
17
18 q.nombre = 'Antonieta'
19 q.save()
20 q.delete()
Al ser clases los modelos pueden tener métodos que efectuen alguna acción en función de los datos que contengan, por ejemplo, la representación como cadena:
1 class Persona(models.Model):
2 nombre = models.CharField(max_length=50)
3 def __unicode__(self):
4 return "Soy %s" % self.nombre
Metainformación Permite agregar información como el nombre de la tabla en la base de datos, una etiqueta de texto, orden por defecto, restricciones de unicidad, etc.
1 class Registro(models.Model):
2 fecha = models.DateField()
3 class Meta:
4 verbose_name = "Registro de actividad"
5 verbose_name_plural = "Registros de actividad"
6 ordering = '-fecha'
Django provee una propiedad en todos los modelos que nos permite hacer SELECT, INSERT, UPDATE y DELETE muy facilmente.
1 Persona.objects.create(nombre='Jose')
2
3 Persona.objects.filter(nombre__istartswith='jos')
4
5 mascotas = Mascota.objects.exclude(sexo=Mascota.MACHO)
6
7 mascotas.filter(raza=Raza).delete()
Los managers devuelven objetos del tipo QuerySet con el SQL calculado pero no evaluado (no se ejecutó sobre la base), cuando se recorre por primera vez, se ejecuta la consulta.
algo
Si bien django provee un buen numero de características como
disponemos de muchos paquetes de 3ros que se instalan con pip y proveen extensiones, comandos, template tags, vistas genericas, etc.
Las aplicaciones de terceros ahorran mucho tiempo.
Permite manejar versiones de base de datos. Faclita el desarrollo iterativo incremental, permitiendo aumentar minimizar el uso de SQL al momento de modificar los modelos.
Provee comandos de manage.py para:
Analiza las diferencias entre models.py y la base de datos y genera un script de migración
Aplica o desaplica migraciones de esquema (estructura)
Convierte aplicaciones que no usen South, en aplicaciones con South
Aplica o desaplica migraciones de datos (estructura)
2 y 4 son transparentes
Se instala con pip en nuestro ambiente
1 pip install South
Se agrega como una aplicación instalada en setting.py en la lista de INSTALLED_APPS.
1 INSTALLED_APPS = (
2 ...
3 'south',
4 )
1 # Convertir a South
2 python manage.py convert_to_south common
3
4 # Crear una migración
5 python manage.py schemamigration common --auto
6
7 # Aplicar una migración
8 python manage.py migrate common
9
10 # Listar
11 python manage.py migrate common --list
12
13 # Vovler a algún estado de la base de atos
14 python manage.py migrate common 001
| Table of Contents | t |
|---|---|
| Exposé | ESC |
| Full screen slides | e |
| Presenter View | p |
| Source Files | s |
| Slide Numbers | n |
| Toggle screen blanking | b |
| Show/hide slide context | c |
| Notes | 2 |
| Help | h |